import { uniAPIWrap, asyncUniAPIWrap } from "@/utils/apiWrap";
import { nilV } from "utils";
import type { DBSaveOpt } from "../../db.type";

// #ifdef H5
function h5Save(opt: DBSaveOpt) {
    let manager = opt.h5Store === "local" ? window.localStorage : window.sessionStorage;
    if (nilV(opt.value)) {
        // 移除
        manager.removeItem(opt.key);
    } else {
        manager.setItem(opt.key, opt.value || "");
    }
    if (opt._type === "async") {
        // 如果异步, 就返回
        let { success } = opt || {};
        success && success("save ok");
    }
}
// #endif

// #ifndef H5
// 移除
function removeLocal(opt: DBSaveOpt) {
    if (opt._type === "sync") {
        uniAPIWrap("removeStorageSync", opt.key);
    } else {
        let { _type, key, value, h5Store, ...others } = opt || {};
        asyncUniAPIWrap("removeStorage", {
            key: key,
            ...others,
        });
    }
}
// 保存
function save2Local(opt: DBSaveOpt) {
    if (opt._type === "sync") {
        uniAPIWrap("setStorageSync", opt.key, opt.value || "");
    } else {
        let { _type, key, value, h5Store, ...others } = opt || {};
        asyncUniAPIWrap("setStorage", {
            key: key,
            data: value || "",
            ...others,
        });
    }
}
// 保存
function saveAction(opt: DBSaveOpt) {
    if (nilV(opt.value)) {
        // 移除
        removeLocal(opt);
    } else {
        // 保存
        save2Local(opt);
    }
}
// #endif

function save(opt: DBSaveOpt) {
    // #ifdef H5
    h5Save(opt);
    // #endif

    // #ifndef H5
    saveAction(opt);
    // #endif
}

export { save };
